package cn.tedu.sp06zuul.filter;

import cn.tedu.util.JsonResult;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Slf4j
@Component
public class AccessFilter extends ZuulFilter {

    //设置过滤器的类型：pre, routing, post, error
    //zuul自动配置的回调方法
    @Override
    public String filterType() {
        log.warn("zuul自动配置过滤器类型");

        //return "pre";
        return FilterConstants.PRE_TYPE;
    }

    //过滤器的顺序号
    @Override
    public int filterOrder() {
        log.warn("zuul自动配置过滤器的顺序号");
        /*
            在默认的第5个过滤器中，向上下文对象放入了 serviceId,在后面的过滤器才能访问资源
         */
        return 6;
    }

    //针对当前请求进行判断，是否要执行过滤代码
    @Override
    public boolean shouldFilter() {
        log.warn("zuul判断是否要权限过滤");

//如果客户端调用商品，要判断权限。  否则调用用户或订单，不判断权限。
        //获得当前请求的上下文对象，从上下文对象中取出正在访问的 serviceId
        RequestContext ctx = RequestContext.getCurrentContext();

        //判断 serviceId 是否是 "item-service"
        String serviceId = (String) ctx.get(FilterConstants.SERVICE_ID_KEY);//"serviceId"

        return serviceId.equalsIgnoreCase("item-service");
    }

    //过滤代码
    @Override
    public Object run() throws ZuulException {
        log.warn("zuul进行过滤");
        //http://localhost:3001/item-service/gfy5rnrju464?token=12345

        //获得上下文对象
        RequestContext ctx = RequestContext.getCurrentContext();
        // 从上下文对象取出 request 对象
        HttpServletRequest request = ctx.getRequest();
        // 用 request 接收 token 参数
        String token = request.getParameter("token");
        //如果 token 不存在，null,"","  "
        if (StringUtils.isBlank(token)){
            // 阻止继续访问
            ctx.setSendZuulResponse(false);
            // 直接返回响应:JsonResult {code:500,msg:"没登录",data:null不用写}
            String json = JsonResult.build().code(500).msg("没登录").toString();

            ctx.addZuulResponseHeader("Content-Type","application/json;charset=UTF-8");
            ctx.setResponseBody(json);
        }
        return null;    //zuul当前版本没有使用这个返回值

    }
}
